// 类型别名 类
type des = new (...args: []) => object

/**
 * 类装饰器
 * description：描述
 */
export function classDescripter(description: string) {
  return function (target: des) {
    // 把类描述保存到原型中
    target.prototype.$desc = description
  }
}

/**
 * 成员装饰器
 * description：描述
 */
export function propDescripter(description: string) {
  return function (target: any, key: string) {
    // 把属性描述保存到该类的原型中
    if (!target.$attr) target.$attr = [];
    target.$attr.push({ description, key })
  }
}

/**
 * 打印一个对象
 * @param obj 
 */
export function printObj(obj: any) {

  if (obj.$desc) {
    // 输出类描述
    console.log(obj.$desc); // 用户
  } else {
    // 输出对象的构造函数名称
    console.log(obj.constructor.name); // 'User'
  }

  if (!obj.$attr) {
    obj.$attr = []
  }

  // 输出所有的属性描述和属性值
  // console.log(obj.$attr); // [{description:'账号',key:'account'},{description:'密码',key:'pwd'}]
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      const prop = obj.$attr.find((it: any) => it.key === key)
      if(prop){
        console.log(`\t${prop.description}:${obj[key]}`);
      }else{
        console.log(`\t${key}:${obj[key]}`);
      }
    }
  }

}